// 在开发中推荐使用哪种声明那？

// 1. {}: 我是一个一无所有的对象

// 2.null:这里本该有个对象，但是没有

// 3.undefined:这里不该有任何值

// 没毛病
var o = {}
o.name = 'o'

// 报错
var o2 = null
o2.name = 'o'

// var a={} //声明我是一个对象字面量，里面值是空的
// var a = null //只是声明了一个变量a，但是啥类型都没给说明，这个要用它需要后面再赋值

// {}是一个不完全空对象，原型链上有Object，null为原型链顶端，因此Object.prototype.__proto__ === null为true。

// null是完全空对象，原型链也没有。
// []
// []原型链上还比{}多一个Array
// 所以，纯粹意义上初始化一个空对象应该用null; {}更像是初始化对象，和new一个没有key的Obejct是一样的。

// 注：在转化布尔值时，对于对象而言，只有null转为false，其他的都为true
// 因此，一定要注意  []   {}  都会被转为true.

// 在后端传递数据过来进行判断时，为数组时判断数组的长度，为对象时用if(Object.keys(obj).length){}，判断对象属性数组长度。

// 如果可能传过来null，也有可能传过来数组，并且不希望空数组执行语句，则可以 if（res && res.length）, res 和 res.length位置不能换，如果为null，则直接返回null，后面的res.length不执行，从而不报错，如果为[],则res.length为0，返回0, 也将空数组去除了。
// if(res?.res.length){}  === if(res && res.length) {}

// 因为数组(不管是不是空的)属于对象类型，对象类型转为boolean类型(内部对应ToBoolean()操作)时都是true。所以判断数组一般使用的是判断数组的长度。
